package com.bear.sgg.springboot_06_web.errorPageTest;

import com.bear.sgg.springboot_06_web.exception.MyErrorPathException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @ClassNmae MyExceptionHandlerController
 * @Description 异常处理控制器
 * @Author bear
 * @Date 2020/3/11 0011 下午 10:02
 */

/*
*   @ControllerAdvice：用于注解捕捉异常的控制器
* */
@ControllerAdvice
public class MyExceptionHandlerController {

    /**
     * ExceptionHandler注解的value属性为需要进行捕捉处理的异常
     *
     * @param e       所产生的异常
     * @param request 原请求
     * @return 重定向或转发请求、页面
     */
    @ExceptionHandler(value = MyErrorPathException.class)
    public String handleMyException(Exception e, HttpServletRequest request) {
        /*在DefaultErrorAttributes类中的addStatus方法中会获取request中的javax.servlet.error.status_code作为状态码
        * 由于捕捉和处理异常后状态码会变为200（这不是我们想要得到的），所以需要在这里把状态码重新改为500*/
        request.setAttribute("javax.servlet.error.status_code",500);

        //将异常信息放入到请求域中，以便MyErrorAttributes类放入到错误属性中
        Map<String, String> ext = new HashMap<>();
        ext.put("exception", e.getClass().toString());
        ext.put("message", e.getMessage());
        request.setAttribute("ext", ext);
        /*
        *分发到/error（这里不能用重定向，因为使用重定向的话，上述的javax.servlet.error.status_code属性会变空，则默认
        * 的状态码为999（这不是我们想要的）。
        * */
        return "forward:/error";
    }
}
